package com.example.musicplayer

import android.annotation.SuppressLint
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Intent
import android.media.MediaPlayer
import android.os.Binder
import android.os.Build
import android.os.IBinder
import android.provider.MediaStore
import android.util.Log
import android.view.View
import androidx.core.app.NotificationCompat
import java.io.IOException

class MusicService : Service() {
    companion object {
        val Commond = "Operate" // 操作命令
    }

    val TAG = "MainActivity"

    val mediaPlayer = MediaPlayer() // 音乐播放器实例
    val musicList: MutableList<String> = mutableListOf<String>() // 音乐路径列表
    val musicNameList: MutableList<String> = mutableListOf<String>() // 音乐名称列表
    var current = 0 // 当前播放的音乐索引
    var isPause = false // 是否暂停
    var isPrepared = false // 是否准备好
    val binder = MusicBinder() // 绑定器实例

    inner class MusicBinder : Binder() {
        val musicName
            get() = if (musicNameList.isNotEmpty()) musicNameList[current] else "No Music" // 获取当前音乐名称
        var currentPosition
            get() = if (isPrepared) mediaPlayer.currentPosition else 0 // 获取当前播放位置
            set(value) {
                if (isPrepared) mediaPlayer.seekTo(value) // 设置播放位置
            }
        val duration
            get() = if (isPrepared) mediaPlayer.duration else 0 // 获取音乐时长
        val size
            get() = musicList.size // 获取音乐列表大小
        val currentIndex
            get() = current // 获取当前播放索引
    }

    override fun onCreate() {
        super.onCreate()
        // 获取音乐列表
        getMusicList()

        // 打印音乐列表大小
        Log.d(TAG, "Music list size: ${musicList.size}")

        // 设置 MediaPlayer 完成播放的监听器
        mediaPlayer.setOnCompletionListener {
            current++
            if (current >= musicList.size) {
                current = 0
            }
            play() // 播放下一首音乐
        }

        // 设置 MediaPlayer 准备完成的监���器
        mediaPlayer.setOnPreparedListener {
            isPrepared = true
            it.start() // 开始播放
        }

        // 设置 MediaPlayer 错误监听器
        mediaPlayer.setOnErrorListener { mp, what, extra ->
            Log.e(TAG, "MediaPlayer error: what=$what, extra=$extra")
            true // 返回 true 表示错误已处理
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val operate = intent?.getIntExtra(Commond, 1) ?: 1
        when (operate) {
            1 -> play() // 播放音乐
            2 -> pause() // 暂停音乐
            3 -> stop() // 停止音乐
            4 -> next() // 下一首
            5 -> prev() // 上一首
        }
        return super.onStartCommand(intent, flags, startId)
    }

    // 暂停按钮点击事件
    fun pause() {
        if (isPause) {
            mediaPlayer.start() // 继续播放
            isPause = false
        } else {
            mediaPlayer.pause() // 暂停播放
            isPause = true
        }
    }

    // 停止按钮点击事件
    fun stop() {
        mediaPlayer.stop() // 停止播放
        isPrepared = false
        stopSelf() // 停止服务
    }

    // 下一首按钮点击事件
    fun next() {
        current++
        if (current >= musicList.size) {
            current = 0
        }
        play() // 播放下一首音乐
    }

    // 上一首按钮点击事件
    fun prev() {
        current--
        if (current < 0) {
            current = musicList.size - 1
        }
        play() // 播放上一首音乐
    }

    // 播放音乐
    fun play() {
        if (musicList.isEmpty()) return
        val path = musicList[current]
        try {
            mediaPlayer.reset()
            isPrepared = false
            mediaPlayer.setDataSource(path) // 指定数据源
            mediaPlayer.prepareAsync() // 异步准备
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    override fun onBind(intent: Intent): IBinder {
        return binder // 返回绑定器实例
    }

    // 获取音乐列表
    private fun getMusicList() {
        val cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null)
        if (cursor != null) {
            while (cursor.moveToNext()) {
                val dataIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA)
                val titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)
                if (dataIndex != -1 && titleIndex != -1) {
                    val musicPath = cursor.getString(dataIndex)
                    musicList.add(musicPath) // 添加音乐路径到列表
                    val musicName = cursor.getString(titleIndex)
                    musicNameList.add(musicName) // 添加音乐名称到列表
                    Log.d(TAG, "getMusicList(): $musicPath name: $musicName")
                }
            }
            cursor.close()
        }
    }
}